Introduction

Ce cours vise à vous fournir les compétences nécessaires pour créer des visualisations de données percutantes et informatives en utilisant la bibliothèque ggplot2 de R. Que vous soyez un analyste de données, un scientifique de données, ou simplement quelqu’un d’intéressé par la data science, ce cours vous aidera à transformer vos données en insights visuels compréhensibles.

Pourquoi la Visualisation de Données?

La visualisation de données est essentielle dans le monde d’aujourd’hui.

  • Communication Efficace: La visualisation aide à communiquer les résultats et les insights de manière claire et efficace.
  • Exploration de Données: Elle joue un rôle clé dans l’exploration de données, permettant de découvrir des tendances, des motifs et des anomalies.
  • Prise de Décision Basée sur les Données: Les visualisations rendent les données compréhensibles, facilitant ainsi la prise de décisions éclairées.

Qu’est-ce que ggplot2?

ggplot2: Un Outil Puissant pour la Visualisation de Données

  • Partie de l’écosystème R: ggplot2 est une bibliothèque R largement utilisée pour la création de visualisations de données de haute qualité.
  • Basé sur la Grammaire de la Graphique: ggplot2 utilise les concepts de la “grammaire de la graphique”, une approche systématique pour construire des graphiques en couches.
  • Personnalisable et Flexible: Il offre une grande flexibilité pour personnaliser les graphiques, ce qui le rend adapté pour une large gamme de scénarios.

Objectifs du Cours

À la fin de ce cours, vous serez capable de :

  • Comprendre les principes fondamentaux de la visualisation de données.
  • Utiliser ggplot2 pour créer une variété de graphiques.
  • Personnaliser vos graphiques pour les rendre plus informatifs et visuellement attrayants.
  • Appliquer les meilleures pratiques en matière de design de graphiques.
Illustration du langage R par DALL-E
Illustration du langage R par DALL-E

Organisation

Contenu du Cours : - Démonstrations - Exercices

Ressources

Création de Graphiques de Base

Chaque graphique utilise ggplot()pour initialiser l’objet ggplot et spécifie la source de données (data) et l’aesthetic mapping (aes) qui définit quelles variables sont utilisées sur les axes x et y, ainsi que d’autres paramètres esthétiques tels que la couleur, la taille, etc.

barplot

library(tidyverse)
## -- Attaching core tidyverse packages ------------------------ tidyverse 2.0.0 --
## v dplyr     1.1.2     v readr     2.1.4
## v forcats   1.0.0     v stringr   1.5.0
## v ggplot2   3.4.3     v tibble    3.2.1
## v lubridate 1.9.2     v tidyr     1.3.0
## v purrr     1.0.1     
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
## i Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
head(diamonds)
ggplot(data = diamonds, aes(x = cut)) +
  geom_bar()

histogrammes

ggplot(data = diamonds, aes(x = carat)) +
  geom_histogram(binwidth = 0.1)

scatterplot et jitter

ggplot(data = diamonds,  aes(x = carat, y = price)) +
  geom_point()

ggplot(data = diamonds,  aes(x = carat, y = price)) +
  geom_jitter()

boxplot

data <- data.frame(
  Group = rep(c("A", "B", "C"), each = 100),
  Value = rnorm(300)
)

# Créez un boxplot en utilisant ggplot2
ggplot(data, aes(x = Group, y = Value)) +
  geom_boxplot()

lines

diamonds %>%
  group_by(carat) %>%
  summarise(mean_price = mean(price)) %>% 
  ggplot(aes(x = carat, y = mean_price)) +
  geom_line()

Personnalisation des graphiques : couleurs, légendes, et titres.

ggplot2 est un système de création de graphiques pour R, basé sur la grammaire des graphiques. Il permet de créer des graphiques complexes en assemblant des éléments de base de manière intuitive.

# Barplot des Diamants par Qualité de Coupe
?scale_fill_brewer()
## starting httpd help server ... done
ggplot(data = diamonds, aes(x = cut, fill = cut)) +
  geom_bar() + 
  labs(title = "Distribution des Diamants par Qualité de Coupe",
       x = "Qualité de la Coupe",
       y = "Nombre de Diamants") +
  scale_fill_brewer(palette = "Set1", guide = 'none') +
  theme_minimal()

ggplot(data = diamonds, aes(x = carat, y = price, color = clarity)) +
  geom_point() +
  labs(title = "Relation entre le Poids et le Prix des Diamants",
       x = "Carats",
       y = "Prix (USD)",
       color = "Clarté") +
  scale_color_brewer(type = "seq", palette = "Blues") +
  theme_classic() +
  theme(
    axis.title = element_text(colour = "blue", face = "bold"),
    plot.title = element_text(colour = "blue", face = "bold"),
    plot.subtitle = element_text(colour = "blue", face = "bold"))

# Utilisation de `theme_set`
theme_set(theme_bw() + theme(
  axis.title = element_text(colour = "blue", face = "bold"),
  plot.title = element_text(colour = "blue", face = "bold"),
  plot.subtitle = element_text(colour = "blue", face = "bold")))
# Différence entre Setting et Mapping

# gauche : setting
ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point(shape = 10)

# droite : mapping
ggplot(mpg, aes(x = displ, y = hwy, shape = drv)) +
  geom_point()                                       

#  Plusieurs façons de modifier les couleurs et les thèmes
p <- ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point()

p <- p + geom_point(color = "red")  
p <- p +  aes(color = drv)
p <- p + aes(color = cty > 20)    
p + theme_bw()

p + xlim(0, 8) + ylim(0, 40)
## Warning: Removed 3 rows containing missing values (`geom_point()`).
## Removed 3 rows containing missing values (`geom_point()`).

p

ggplot(mpg, aes(x = displ, y = hwy)) +
  geom_point() +
  scale_x_continuous(breaks = seq(0, 10, 1)) +
  scale_y_continuous(labels = scales::comma_format(scale = 1e-4)) +
  theme(axis.text.x = element_text(size = 10, color = "blue"),
        axis.text.y = element_text(size = 12, color = "green"))

Techniques Avancées de Visualisation :

Utilisation de facettes pour des graphiques multi-panneaux avec les données babynames

  • Chargement des bibliothèques :babynames, et viridis utilisées pour les données, et les palettes de couleurs, respectivement.
  • Préparation des données : Sélection des prénoms spécifiques dans le dataset babynames et filtrage par sexe.
  • Création du graphique :
    • ggplot() initialise le graphique.
    • geom_area() crée des graphiques à aire.
    • scale_fill_viridis() applique une palette de couleurs.
    • theme() et theme_ipsum() sont utilisés pour personnaliser l’apparence du graphique.
    • facet_wrap(~name, scale="free_y") divise le graphique en plusieurs panneaux, un pour chaque nom, avec des échelles y libres.

Ce script crée un graphique qui montre la popularité de certains prénoms américains au fil du temps.

library(babynames)
library(viridis)
## Loading required package: viridisLite
# Load dataset from github
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/3_TwoNumOrdered.csv", header=T)
data$date <- as.Date(data$date)

# Load dataset from github
don <- babynames %>% 
  filter(name %in% c("Ashley", "Amanda", "Mary", "Deborah",
                     "Dorothy", "Betty", "Helen", "Jennifer", "Shirley")) %>%
  filter(sex=="F")

# Plot
don %>%
  ggplot( aes(x=year, y=n, group=name, fill=name)) +
  geom_area() +
  scale_fill_viridis(discrete = TRUE) +
  theme(legend.position="none") +
  ggtitle("Popularity of American names in the previous 30 years") + 
  theme(
    legend.position="none",
    panel.spacing = unit(0, "lines"),
    strip.text.x = element_text(size = 8),
    plot.title = element_text(size=13)
  ) +
  facet_wrap(~name, scale="free_y")

Graphique de l’évolution du prix du bitcoin

  • Chargement et préparation des données : Les données sont chargées d’une source en ligne et la colonne date est convertie au format Date.
  • Création du graphique :
    • ggplot() initialise le graphique.
    • geom_line() et geom_point() sont utilisés pour créer un graphique linéaire avec des points mis en évidence.
    • theme_ipsum() avec base_family = "Arial" applique un thème avec une police standard.
    • ggtitle() ajoute un titre au graphique.

Ce script montre l’évolution récente du prix du bitcoin.

data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/3_TwoNumOrdered.csv", header=T)
data$date <- as.Date(data$date)

# Plot
data %>%
  tail(1000) %>%
  ggplot( aes(x=date, y=value)) +
  geom_line( color="grey") +
  geom_point(shape=21, color="black", fill="#69b3a2", size=6) +
  ggtitle("Evolution of bitcoin price")

Créer une carte avec leaflet

# Installer et charger le package leaflet
if (!require(leaflet)) {
    install.packages("leaflet")
}
## Loading required package: leaflet
library(leaflet)

# Créer une carte de base
map <- leaflet() %>% 
  addTiles()  # Ajoute les tuiles de base d'OpenStreetMap

# Ajouter un marqueur
map <- map %>% 
  addMarkers(lng = -0.09, lat = 51.50, popup = "The marker is placed at London")

# Changer le fond de carte
map <- map %>% 
  addProviderTiles(providers$Stamen.TonerLite)

# Données pour les marqueurs supplémentaires
data <- data.frame(
  lng = c(-0.09, -0.11, -0.12),
  lat = c(51.50, 51.52, 51.48),
  label = c("Point 1", "Point 2", "Point 3")
)

# Ajouter des marqueurs supplémentaires
map <- map %>% 
  addMarkers(data = data, ~lng, ~lat, popup = ~label)

# Afficher la carte
map
Paris <- c(2.351462,48.8567)
m2 <- leaflet() %>% setView(lng = Paris[1], lat = Paris[2], zoom = 12) %>% 
  addTiles()
m2 %>% addProviderTiles("Stamen.Toner")
content <- paste(sep = "<br/>",
  "<b><a href='https://www.intelligence-artificielle-school.com/ecole/nos-campus/toulouse/'>IA School - Toulouse</a></b>",
  "2 Bd de Strasbourg",
  "31000 Toulouse"
)

leaflet() %>% 
  addTiles() %>%
  addPopups(1.4485130539619018, 43.60676750775245, 
            content, options = popupOptions(closeButton = FALSE)
  )
# Chargement des bibliothèques nécessaires
library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(tidyverse)
library(lubridate)

# Configurer la graine aléatoire pour la reproductibilité
set.seed(123)

# Créer une séquence de dates (chaque mois de 2020)
dates <- seq(ymd("2020-01-01"), ymd("2020-12-31"), by="month")

# Codes d'état des États-Unis (exemple avec 5 états)
state_codes <- c("AL", "AK", "AZ", "AR", "CA")

# Générer des données aléatoires
num_rows <- length(dates) * length(state_codes)
df <- data.frame(
  time = rep(dates, each=length(state_codes)),
  state_code = rep(state_codes, times=length(dates)),
  num_colonies = sample(100:10000, num_rows, replace = TRUE),
  percent_lost = runif(num_rows, 0, 100),
  varroa_mites = runif(num_rows, 0, 100),
  other_pests = runif(num_rows, 0, 100),
  diseases = runif(num_rows, 0, 100),
  pesticides = runif(num_rows, 0, 100),
  other = runif(num_rows, 0, 100),
  unknown = runif(num_rows, 0, 100)
)

# Afficher les premières lignes du dataframe
head(df)
fig <- df %>%
       plot_ly() %>%
       add_trace(
         type = "choropleth",
         locations = ~state_code,
         locationmode = "USA-states",
         z = ~varroa_mites,
         colorscale = "Viridis_r",
         color = ~varroa_mites
       ) %>%
       layout(
         geo = list(scope = "usa"),
         frame = ~time
       )
fig
## Warning: 'layout' objects don't have these attributes: 'frame'
## Valid attributes include:
## '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'

Pour en savoir plus : (data to viz)[https://www.data-to-viz.com/]

Exercices

Pour commencer à pratiquer, suivez ces étapes :

  1. Accédez au Dépôt GitHub : Visitez l’URL fournie : https://github.com/universdesdonnees/Introduction-a-R pour accéder au dépôt GitHub contenant les matériaux du cours.

  2. Trouvez le Fichier des Exercices : Dans le dépôt, localisez le fichier nommé exercices7.txt. Ce fichier contient les premiers exercices que vous devez pratiquer.

  3. Lisez et Essayez de Résoudre les Exercices : Ouvrez le fichier exercices7.txt et lisez attentivement les exercices. Essayez de les résoudre par vous-même dans votre environnement R (comme RStudio). Il est important de pratiquer par vous-même avant de regarder les solutions pour mieux apprendre.

  4. Consultez la Correction : Une fois que vous avez tenté de résoudre les exercices, ou si vous rencontrez des difficultés, consultez le fichier correction_exercices7.R pour voir les solutions. Analysez les solutions pour comprendre les méthodes et logiques utilisées.